#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main()
{
  //进程程序替换
  char *const argv[] = {"ps","-ef",NULL};
  char *const envp[] = {"PATH=/bin:/usr/bin","TERM=console",NULL};

  execl("/bin/ps","ps","-ef",NULL);

  //execlp 可以使用环境变量PATH，无需全写路径
  execlp("ps","ps","-ef",NULL);

  //execle 需要自己组装环境变量
  execle("ps","ps","-ef",NULL,envp);

  execv("/bin/ps",argv);

  //execvp 可以使用环境变量，无需全写路径
  execvp("ps",argv);

  //execve 需要自己组装环境变量
  execve("/bin/ps",argv,envp);

  exit(0);
}


//{
//  //非阻塞等待方式
//  pid_t pid;
//  pid=fork();
//  if(pid<0)
//  {
//    printf("%s fork error\n",__FUNCTION__);
//    return 1;
//  }
//  else if(pid==0)
//  {
//    printf("child is run ,pid is: %d\n",getpid());
//    sleep(5);
//    exit(1);
//  }
//  else
//  {
//    int status = 0;
//    pid_t ret = 0;
//    do 
//    {
//      ret = waitpid(-1,&status,WNOHANG);
//      if(ret == 0)
//      {
//        printf("child is running\n");
//      }
//      sleep(1);
//    }while(ret == 0);
//    if(WIFEXITED(status) && ret == pid)
//    {
//      printf("wait child 5s success, child return code is :%d \n",WEXITSTATUS(status));
//    }
//    else
//    {
//      printf("wait child failed, return\n");
//      return 1;
//    }
//  }
//  return 0;
//}


//{
//  //进程阻塞等待
//  pid_t pid;
//  pid = fork();
//  if(pid<0)
//  {
//    printf("%s fork error\n",__FUNCTION__);
//    return 1;
//  }
//  else if(pid==0)
//  {
//    //child
//    printf("child is run, pid id :%d\n",getpid());
//    sleep(5);
//    exit(257);
//  }
//  else
//  {
//    int status = 0;
//    pid_t ret = waitpid(-1,&status,0);
//    printf("this is test for wait\n");
//    if(WIFEXITED(status) && ret == pid)
//    {
//      printf("wait child 5s success, child return code is :%d\n",WEXITSTATUS(status));
//    }
//    else
//    {
//      printf("wait child failed,return\n");
//      return 1;
//    }
//  }
//}


  //进程等待： wait; waitpid;
  //pid_t pid;
  //if((pid=fork())==-1)
  //{
  //  perror("fork");
  //  exit(1);
  //}
  //if(pid==0)
  //{
  //  sleep(20);
  //  exit(10);
  //}
  //else 
  //{
  //  int st;
  //  int ret=wait(&st);

  //  if(ret > 0 && (st & 0X7F) == 0)
  //  {
  //    printf("child exit code:%d\n",(st>>8) & 0XFF);

  //  }
  //  else if(ret > 0)
  //  {
  //    printf("sig code: %d\n",st&0X7F);
  //  }
  //}




  //进程退出：return  exit(刷新缓冲区，清除数据等)   _exit(不做任何处理，直接退出程序)



 // pid_t pid;
 // printf("Before: pid is %d\n",getpid());
 // if((pid=fork())==-1)
 // {
 //   perror("fork()");
 //   exit(1);
 // }
 // printf("After: pid is %d, fork return %d\n",getpid(),pid);
 // sleep(5);




 // pid_t id=fork();
 // if(id<0)
 // {
 //   perror("fork");
 //   return 1;
 // }
 // else if(id>0)
 // {
 //   printf("prent[%d] is sleeping...",getpid());
 //   sleep(30);
 // }
 // else
 // {
 //   printf("child[%d] is begin Z...\n",getpid());
 //   sleep(5);
 //   exit(EXIT_SUCCESS);
 // }


 // int ret=fork();
 // if(ret<0)
 // {
 //   perror("fork");
 //   return 1;
 // }
 // else if(ret==0)
 // {
 //   printf("I am child: %d, ret: %d\n",getpid(),ret);
 // }
 // else
 // {
 //   printf("I am father: %d,ret: %d\n",getpid(),ret);
 // }


//  int ret=fork();
//  printf("hello myproc : %d ,ret : %d \n ",getpid(),ret);
 //bin while(1)
 // {
 //   sleep(1);
 // }


//  printf("pid:%d\n",getpid()); printf("ppid:%d\n",getppid());
//
//  while(1)
//  {
//    sleep(1);
//  }
//
//  while(1)
//  {
//    sleep(1);
//  }
//
//bin  return 0;}
